package com.wbc.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author wangbingchen
 * @Description
 * @create 2021-10-28 15:36
 */
public class DateUtil {

    private DateUtil(){

    }

    /**
     * 获取传入时间的年
     * @param date
     * @return
     */
    public static int getYear(Date date) {
        return Integer.parseInt(parseString(date,"yyyy"));
    }

    /**
     * 获取传入时间的月份
     * @param date
     * @return
     */
    public static int getMonth(Date date) {
        return Integer.parseInt(parseString(date,"MM"));
    }

    /**
     * 获取传入时间的日期
     * @param date
     * @return
     */
    public static int getDay(Date date) {
        return Integer.parseInt(parseString(date,"dd"));
    }


    /**
     * 获取当前时间的年
     * @return
     */
    public static int thisYear() {
        return Integer.parseInt(now("yyyy"));
    }

    /**
     * 获取当前时间的 月
     * @return
     */
    public static int thisMonth() {
        return Integer.parseInt(now("MM"));
    }

    /**
     * 获取当前时间的 日期
     * @return
     */
    public static int thisDay() {
        return Integer.parseInt(now("dd"));
    }


    /**
     *
     * 获取当月 的下一个月1号
     * @return
     */
    public static String firstDayOfNextMonth() {
        return firstDayOfNextMonth(new Date());
    }

    /**
     * 获取传入日期的 下一个月1号
     * @param date
     * @return
     */
    public static String firstDayOfNextMonth(String date) {
        return firstDayOfNextMonth(parseDate(date));
    }

    /**
     * 获取传入日期的 下一个月1号
     * @param date
     * @return
     */
    public static String firstDayOfNextMonth(Date date) {
        int year = getYear(date);
        int month = getMonth(date);
        month++;

        if(month>13){
            throw new RuntimeException("month is error");
        }

        if(month==13){
            month = 1;
            year++;
        }

        String mon = "";
        if(month<10){
            mon = "0";
        }
        mon = mon + month;


        StringBuffer sb = new StringBuffer();
        sb.append(year);
        sb.append("-");
        sb.append(mon);
        sb.append("-01");
        return sb.toString();
    }

    /**
     *
     * 获取当月 的上一个月1号
     * @return
     */
    public static String firstDayOfLastMonth() {
        return firstDayOfLastMonth(new Date());
    }

    /**
     * 获取传入日期的 上一个月1号
     * @param date
     * @return
     */
    public static String firstDayOfLastMonth(String date) {
        return firstDayOfLastMonth(parseDate(date));
    }
    /**
     * 获取传入日期的 上一个月1号
     * @param date
     * @return
     */
    public static String firstDayOfLastMonth(Date date) {
        int year = getYear(date);
        int month = getMonth(date);
        month--;

        if(month<0){
            throw new RuntimeException("month is error");
        }

        if(month==0){
            month = 12;
            year--;
        }

        String mon = "";
        if(month<10){
            mon = "0";
        }
        mon = mon + month;


        StringBuffer sb = new StringBuffer();
        sb.append(year);
        sb.append("-");
        sb.append(mon);
        sb.append("-01");
        return sb.toString();
    }


    /**
     * 获取传入月份的 1号
     * @param date
     * @return
     */
    public static String firstDayOfMonth(Date date) {
        return getFirstDayOfMonth(date);
    }

    /**
     * 获取传入月份的 1号
     * @param date
     * @return
     */
    public static String firstDayOfMonth(String date) {
        return getFirstDayOfMonth(date);
    }

    /**
     * 获取本月第一天
     * @return
     */
    public static String firstDayOfMonth() {
        return getFirstDayOfMonth(new Date());
    }

    /**
     * 获取传入月份的1号
     * @param obj 传入Date 或者 String
     * @return 传入时间的 1号
     */
    private static String getFirstDayOfMonth(Object obj) {
        String yearMonth = null;
        if(obj instanceof Date){
            yearMonth = parseString((Date) obj, "yyyy-MM");
        }

        if(obj instanceof String){
            yearMonth = ((String) obj).substring(0, 7);
        }

        return yearMonth+"-01";
    }


    /**
     *
     * @param dateString 传入时间 支持 年月日时分秒 格式  无视连接符
     * @return Date 类型的时间
     */
    public static Date parseDate(String dateString) {

        dateString = replaceInt(dateString);
        String pattern = "yyyyMMddHHmmss";

        if("".equals(dateString)){
            throw new RuntimeException("dateString is null or empty");
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern.substring(0,dateString.length()));
        Date parse = null;
        try {
            parse = sdf.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;
    }

    //传入的字符串只返回数字
    private static String replaceInt(String dateString) {
        StringBuilder sb = new StringBuilder();
        char[] chars = dateString.toCharArray();

        for (char aChar : chars) {
            if(aChar>47&&aChar<58){
                sb.append(aChar);
            }
        }
        return sb.toString();
    }

    private static String defaultFormat = "yyyy-MM-dd HH:mm:ss";

    /**
     * 获取当前时间 格式为 yyyy-MM-dd HH:mm:ss
     * @return 默认格式的当前时间
     */
    public static String now(){
        return parseString(new Date(),defaultFormat);
    }

    /**
     * 获取当前时间
     * @param format 自定义格式
     * @return 自定义格式的当前时间
     */
    public static String now(String format){
        return parseString(new Date(),format);
    }

    /**
     * 获取今天的年月日
     * @return
     */
    public static String today(){
        return parseString(new Date(),"yyyy-MM-dd");
    }


    /**
     * 获取昨天的年月日
     * @return
     */
    public static String yesterday(){
        return parseString(new Date(System.currentTimeMillis()-24*60*60*1000),"yyyy-MM-dd");
    }

    /**
     * 获取昨天的 自定义格式
     * @return
     */
    public static String yesterday(String format){
        return parseString(new Date(System.currentTimeMillis()-24*60*60*1000),format);
    }

    /**
     * 获取明天天的年月日
     * @return
     */
    public static String tomorrow(){
        return parseString(new Date(System.currentTimeMillis()+24*60*60*1000),"yyyy-MM-dd");
    }

    /**
     * 获取明天天的 自定义格式
     * @return
     */
    public static String tomorrow(String format){
        return parseString(new Date(System.currentTimeMillis()+24*60*60*1000),format);
    }


    /**
     * 自定义时间和格式
     * @param date 时间
     * @param format 格式
     * @return 自定义格式的字符串
     */
    public static String parseString(Date date,String format){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     *
     * @param date 时间
     * @return 默认格式的字符串
     */
    public static String parseString(Date date){
        return parseString(date,defaultFormat);
    }


static class DateBean{

        private String startTime;
        private String endTime;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("DateBean{");
        sb.append("startTime='").append(startTime).append('\'');
        sb.append(", endTime='").append(endTime).append('\'');
        sb.append('}');
        return sb.toString();
    }

    public String getStartTime() {
        return startTime;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public String getEndTime() {
        return endTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }
}



    /**
     * 获取当前时间的1号和下个月的1号
     * @return
     */
    private static DateBean getDateBean() {
        return getDateBean(new Date());
    }

    /**
     *  获取指定时间的1号和下个月的1号
     * @param date 1999-12
     * @return
     */
    private static DateBean getDateBean(String date) {
        return getDateBean(DateUtil.parseDate(date));
    }

    /**
     * 获取指定时间的1号和下个月的1号
     * @param date
     * @return
     */
    private static DateBean getDateBean(Date date) {
        DateBean dateBean = new DateBean();
        dateBean.setStartTime(DateUtil.firstDayOfMonth(date));
        dateBean.setEndTime(DateUtil.firstDayOfNextMonth(date));
        return dateBean;
    }

    public static void main(String[] args) {
        System.out.println("获取当前时间格式为 yyyy-MM-dd HH-mm-ss："+DateUtil.now());
        System.out.println("获取指定格式的当前时间："+DateUtil.now("yyyyMMddHHmmss"));
        System.out.println("将 Date 格式转为 String 可指定格式："+DateUtil.parseString(new Date(),"yyyyMMddHHmmss"));
        System.out.println("获取当前时间的上个月第一天日期："+DateUtil.firstDayOfLastMonth());
        System.out.println("获取指定时间的上个月第一天日期："+DateUtil.firstDayOfLastMonth("2000-01-11"));
        System.out.println("获取当前时间的月份的第一天："+DateUtil.firstDayOfMonth());
        System.out.println("获取指定时间的月份的第一天："+DateUtil.firstDayOfMonth("1999-12-02"));
        System.out.println("获取当前时间的下个月第一天日期："+DateUtil.firstDayOfNextMonth());
        System.out.println("获取指定时间的下个月第一天日期："+DateUtil.firstDayOfNextMonth("1999-12-02"));
        System.out.println("将 String 格式转为 Date 可指定格式："+DateUtil.parseDate("1999-12-02"));
        System.out.println("获取当前时间的1号和下个月的1号："+DateUtil.getDateBean());
        System.out.println("获取指定时间的1号和下个月的1号："+DateUtil.getDateBean("1999-12"));
    }

}